import numpy as np
from torchvision import transforms
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签


def quick_show(image, title):
    plt.figure()
    plt.imshow(image)
    plt.title(title)
    plt.axis('off')


class torch_Transforms_class:
    def __init__(self, image):
        """
        通过opencv读取的图片其格式为ndarray，可以通过torch.from_numpy进行转换
        这里统一使用PIL格式图像，ndarray类型的图像通过ToPILImage()(image)来实现转换
        """
        if isinstance(image, np.ndarray):
            self.image = transforms.ToPILImage()(image)
        else:
            self.image = image

    def Transforms_basic_edit(self):
        """
        这部分包含多个个单独的Transforms预处理函数的使用示例

        """

        """
        #---------------------------中心切割函数---------------------------------#
        CenterCrop(size)
        # size->sequence-(h, w); ->int-(n,n) : 两个数表示长和宽，一个数表示正方形
        """
        CenterCrop_fun = transforms.CenterCrop((400, 300))
        image_crop = CenterCrop_fun(self.image)
        quick_show(image_crop, "中心裁剪")

        """
        #---------------------------随机裁剪函数---------------------------------#
        RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode="constant")
        # size->sequence-(h, w); ->int-(n,n) : 两个数表示长和宽，一个数表示正方形
        # padding-边缘填充，上下左右均填充n个pixel
        """
        # 定义随机裁剪函数，传入参数
        RandomCrop_fun = transforms.RandomCrop((300, 200))
        image_crop = RandomCrop_fun(self.image)
        quick_show(image_crop, "随机裁剪")

        """
        #---------------------------随机大小，长宽比裁剪--------------------------#
        RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(3. / 4., 4. / 3.), interpolation=Image.BILINEAR):
        # size->sequence-(h, w); ->int-(n,n) : 两个数表示长和宽，一个数表示正方形
        # scale:随机裁剪面积比例，默认（0.08,1.00）
        # ratio: 随机长宽比，默认（3/4，4/3）
        # interpolation:插值方法
        """
        RandomResizedCrop_fun = transforms.RandomResizedCrop((200, 300))
        image_crop = RandomResizedCrop_fun(self.image)
        quick_show(image_crop, "随机大小，长宽比裁剪")

        """
        #---------------------------依概率翻转--------------------------#
        RandomHorizontalFlip(p=0.5)
        RandomHorizontalFlip(p=0.5)
        此处不做演示
        """
        # 水平翻转
        transforms.RandomHorizontalFlip()
        # 垂直翻转
        transforms.RandomVerticalFlip()

        """
        #---------------------------随机旋转图片--------------------------#
        RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)
        # degrees:旋转角度，单位为度（非弧度）
            ->int:      当为a时，在(-a,a)之间选择旋转角度
            ->sequence: 当为(a,b)时，在(a,b)之间选择旋转角度
        # resample:重采样方法
        # expand:是否扩大图片，以保持原图信息
        """
        ### 备注： 这一方法只旋转图片，图像的画布不变，超出部分不显示
        RandomRotation_fun = transforms.RandomRotation(90)
        image_rotation = RandomRotation_fun(self.image)
        quick_show(image_rotation, "随机旋转图片")

        """
        #---------------------------边界填充--------------------------#
        Pad(padding, fill=0, padding_mode="constant")
        # padding: 设置填充大小
        ->当为a时，上下左右均填充a个像素
        ->当为（a,b）时，上下填充b个像素，左右填充a个像素
        ->当为（a,b,c,d）时，左，上，右，下分别填充a,b,c,d
        # padding_mode: 填充模式，有四种模式，"constant", "edge", "reflect"和"symmetric"
        # fill: 填充模式为constant时，设置填充的像素值，（R,G,B）or（Gray）
        """
        Pad_fun = transforms.Pad((10, 15, 20, 25), padding_mode="symmetric")
        image_pad = Pad_fun(self.image)
        quick_show(image_pad, "填充")

        """
        #---------------------------随机亮度、对比度和饱和度调整--------------------------#
        ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
        # brightness:亮度
        # contrast:对比度
        # saturation:饱和度参数
        #  * 对于上述参数有  当为a时,从[max(0,1-a),1+a]中随机选择; 当为(a,b)时,从[a,b]中选择
        #  * 一般参数为[0,1]之间
        # hue:色相参数   当为a时,从[-a,a]中选择参数,注：0<=a<=0.5
                        当为(a,b)时,从[a,b]中选择参数,注：-0.5<=a<=b<=0.5
        """
        ColorJitter_fun = transforms.ColorJitter(brightness=[0.5, 1.5], contrast=[0.5, 1.5], saturation=[0.5, 1.5])
        image_colorjitter = ColorJitter_fun(self.image)
        quick_show(image_colorjitter, "随机色彩变化")

        """
        #--------------------------随机遮挡-------------------------------------------#
        RandomErasing(self, p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
        # p:概率值，执行该操作的概率
        # scale:遮挡区域的面积
        # ratio:遮挡区域的长宽比
        # value:设置遮挡区域的像素值 (R,G,B)or (Gray)
        """
        Random_Erasing_fun = transforms.RandomErasing()
        # Random_Erasing_fun = transforms.RandomErasing(p=0.5,scale=(0.5,0.7),ratio=(0.3,3.3),value=0)
        # 这里直接调用默认参数，
        image_erase=Random_Erasing_fun(self.image)
        quick_show(image_erase, "随机遮挡,该函数的使用遇到问题，会报错")
        # todo: 这部分函数使用还有问题,函数transforms.RandomErasing()里面添加了参数就不能正常运行

        pass
